package co.edu.udea.herbario.dao.imp;

import java.util.List;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.criterion.Restrictions;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import co.edu.udea.herbario.dao.AdministradorDao;
import co.edu.udea.herbario.dto.Administrador;
import co.edu.udea.herbario.dto.Especie;
import co.edu.udea.herbario.excepcion.Excepcion;

/**
 * Esta clase contiene la implementacion de los metodos planteados en la interface 
 * AdministradorDao,los cuales son utilizados para gestionar los datos de persistencia
 * asociados a los usuarios administradores 
 * 
 * @author Lorena Orozco
 *
 */

public class AdministradorDaoImp extends HibernateDaoSupport implements AdministradorDao
{
	@Override
	public List<Administrador> obtenerUsuarios() throws Excepcion
	{
		Session sesion = null;	//Se inicializa la variable para obtener la sesion
		List<Administrador> usuarios = null;	//inicializacion de objeto tipo Lista para almacenar los
												//valores de retorno		
		
		try
		{
			sesion = getSession();	//se obtiene la sesion
			//se genera la lista de todos administradores registrados en la tabla Administrador
			usuarios = sesion.createCriteria(Administrador.class).list();				
		}
		catch (HibernateException e)
		{
			throw new Excepcion(e);			
		}
		
		return usuarios;	//retorna la lista de administradores hallados
	}
	
	@Override
	public Administrador obtener(int id) throws Excepcion 
	{
		Session sesion = null;	//Se inicializa la variable para obtener la sesion
		Administrador adm = null;	//inicializacion de objeto tipo Administrador para almacenar el 
									//valor de retorno
		
		try
		{
			sesion = getSession();	//se obtiene la sesion
			//se obtiene el elemento de tipo Administrador asociado al id pasado como parametro
			adm = (Administrador)sesion.get(Administrador.class, id);			
		}
		catch (HibernateException e)
		{
			throw new Excepcion(e);			
		}
		
		return adm;	//retorna el elemento hallado en la tabla Administrador
	}
	
	@Override
	public Administrador obtenerUsuario(String userName) throws Excepcion
	{
		Session sesion = null;	//Se inicializa la variable para obtener la sesion
		Administrador adm = null;	//inicializacion de objeto tipo Administrador para almacenar el 
									//valor de retorno
		
		try
		{
			sesion = getSession();	//se obtiene la sesion
			//se obtiene el elemento de tipo Administrador asociado al userName pasado como parametro
			adm = (Administrador)sesion.get(Administrador.class, userName);			
		}
		catch (HibernateException e)
		{
			throw new Excepcion(e);			
		}
		return adm;
	}

	@Override
	public int actualizar(Administrador adm) throws Excepcion
	{		
		int res;	//instanciacion de objeto tipo entero para almacenar el valor del retorno
		
		try
		{
			//actualiza la informacion del elemento adm de tipo Administrador
			getHibernateTemplate().update(adm);	
			res = 1;	//almacena 1 como valor de retorno indicando que la operacion es exitosa
		}
		catch (HibernateException e)
		{
			res = -1;	//almacena -1 indicando que la operacion fallo
			throw new Excepcion(e);				
		}
		
		return res;	//retorna el valor de exito o fallo de la operacion
	}

	@Override
	public int crear(Administrador adm) throws Excepcion
	{
		int res;	//instanciacion de objeto tipo entero para almacenar el valor del retorno
		
		try
		{
			//crea el elemento adm en la tabla Administrador
			getHibernateTemplate().save(adm);			
			res = 1;	//almacena 1 como valor de retorno indicando que la operacion es exitosa
		}
		catch (HibernateException e)
		{
			res = -1;	//almacena -1 indicando que la operacion fallo
			throw new Excepcion(e);				
		}		
		
		return res;	//retorna el valor de exito o fallo de la operacion
	}


	@Override
	public int deshabilitar(Administrador adm) throws Excepcion
	{
		int res;	//instanciacion de objeto tipo entero para almacenar el valor del retorno
		
		try
		{
			//Modifica el estado del elemento de tipo Administrador dentro del sistema
			adm.setActivo(false);	//Se indica que el administrador esta inactivo
			getHibernateTemplate().update(adm);	//actualiza la informacion del elemento de tipo Administrador
			res = 1;	//almacena 1 como valor de retorno indicando que la operacion es exitosa
		}
		catch (HibernateException e)
		{
			res = -1;	//almacena -1 indicando que la operacion fallo
			throw new Excepcion(e);				
		}
		
		return res;	//retorna el valor de exito o fallo de la operacion
	}
}
